home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / mozilla-firefox / include / xpcom / nsProxiedService.h < prev    next >
C/C++ Source or Header  |  2006-05-08  |  6KB  |  139 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /* ***** BEGIN LICENSE BLOCK *****
  3.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  4.  *
  5.  * The contents of this file are subject to the Mozilla Public License Version
  6.  * 1.1 (the "License"); you may not use this file except in compliance with
  7.  * the License. You may obtain a copy of the License at
  8.  * http://www.mozilla.org/MPL/
  9.  *
  10.  * Software distributed under the License is distributed on an "AS IS" basis,
  11.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12.  * for the specific language governing rights and limitations under the
  13.  * License.
  14.  *
  15.  * The Original Code is mozilla.org code.
  16.  *
  17.  * The Initial Developer of the Original Code is
  18.  * Netscape Communications Corporation.
  19.  * Portions created by the Initial Developer are Copyright (C) 1998
  20.  * the Initial Developer. All Rights Reserved.
  21.  *
  22.  * Contributor(s):
  23.  *   Pierre Phaneuf <pp@ludusdesign.com>
  24.  *
  25.  * Alternatively, the contents of this file may be used under the terms of
  26.  * either of the GNU General Public License Version 2 or later (the "GPL"),
  27.  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  28.  * in which case the provisions of the GPL or the LGPL are applicable instead
  29.  * of those above. If you wish to allow use of your version of this file only
  30.  * under the terms of either the GPL or the LGPL, and not to allow others to
  31.  * use your version of this file under the terms of the MPL, indicate your
  32.  * decision by deleting the provisions above and replace them with the notice
  33.  * and other provisions required by the GPL or the LGPL. If you do not delete
  34.  * the provisions above, a recipient may use your version of this file under
  35.  * the terms of any one of the MPL, the GPL or the LGPL.
  36.  *
  37.  * ***** END LICENSE BLOCK ***** */
  38.  
  39. #ifndef nsProxiedService_h_
  40. #define nsProxiedService_h_
  41.  
  42. #include "nsIServiceManager.h"
  43. #include "nsIProxyObjectManager.h"
  44.  
  45. ////////////////////////////////////////////////////////////////////////////////
  46. // NS_WITH_PROXIED_SERVICE: macro to make using services that need to be proxied
  47. //                                   before using them easier. 
  48. // Now you can replace this:
  49. // {
  50. //      nsresult rv;
  51. //      nsCOMPtr<nsIMyService> pIMyService = 
  52. //               do_GetService(kMyServiceCID, &rv);
  53. //      if(NS_FAILED(rv))
  54. //          return;
  55. //      nsCOMPtr<nsIProxyObjectManager> pIProxyObjectManager = 
  56. //               do_GetService(kProxyObjectManagerCID, &rv);
  57. //      if(NS_FAILED(rv))
  58. //          return;
  59. //      nsIMyService pIProxiedObject = NULL;
  60. //      rv = pIProxyObjectManager->GetProxyForObject(pIProxyQueue, 
  61. //                                                              NS_GET_IID(nsIMyService), 
  62. //                                                              pIMyService, PROXY_SYNC,
  63. //                                                              (void**)&pIProxiedObject);
  64. //      pIProxiedObject->DoIt(...);  // Executed on same thread as pIProxyQueue
  65. //      ...
  66. //      pIProxiedObject->Release();  // Must be done as not managed for you.
  67. //      }
  68. //  with this:
  69. //      {
  70. //      nsresult rv;
  71. //      NS_WITH_PROXIED_SERVICE(nsIMyService, pIMyService, kMyServiceCID, 
  72. //                                      pIProxyQueue, &rv);
  73. //      if(NS_FAILED(rv))
  74. //          return;
  75. //      pIMyService->DoIt(...);  // Executed on the same thread as pIProxyQueue
  76. //      }
  77. // and the automatic destructor will take care of releasing the service and
  78. // the proxied object for you. 
  79. // 
  80. // Note that this macro requires you to link with the xpcom DLL to pick up the
  81. // static member functions from nsServiceManager.
  82.  
  83. #define NS_WITH_PROXIED_SERVICE(T, var, cid, Q, rvAddr)     \
  84.     nsProxiedService _serv##var(cid, NS_GET_IID(T), Q, PR_FALSE, rvAddr);     \
  85.     T* var = (T*)(nsISupports*)_serv##var;
  86.  
  87. #define NS_WITH_ALWAYS_PROXIED_SERVICE(T, var, cid, Q, rvAddr)     \
  88.     nsProxiedService _serv##var(cid, NS_GET_IID(T), Q, PR_TRUE, rvAddr);       \
  89.     T* var = (T*)(nsISupports*)_serv##var;
  90.  
  91. ////////////////////////////////////////////////////////////////////////////////
  92. // nsProxiedService
  93. ////////////////////////////////////////////////////////////////////////////////
  94.  
  95. class nsProxiedService
  96. {
  97. public:
  98.     nsProxiedService(const nsCID &aClass, const nsIID &aIID, 
  99.                      nsIEventQueue* aEventQ, PRBool always, nsresult* rv)
  100.     {
  101.         nsCOMPtr<nsISupports> svc = do_GetService(aClass, rv);
  102.         if (NS_SUCCEEDED(*rv))
  103.             InitProxy(svc, aIID, aEventQ, always, rv);
  104.     }
  105.  
  106.     nsProxiedService(const char* aContractID, const nsIID &aIID, 
  107.                      nsIEventQueue* aEventQ, PRBool always, nsresult* rv)
  108.     {
  109.         nsCOMPtr<nsISupports> svc = do_GetService(aContractID, rv);
  110.         if (NS_SUCCEEDED(*rv))
  111.             InitProxy(svc, aIID, aEventQ, always, rv);
  112.     }
  113.     
  114.     operator nsISupports*() const
  115.     {
  116.         return mProxiedService;
  117.     }
  118.  
  119. private:
  120.  
  121.     void InitProxy(nsISupports *aObj, const nsIID &aIID,
  122.                    nsIEventQueue* aEventQ, PRBool always, nsresult*rv)
  123.     {
  124.         PRInt32 proxyType = PROXY_SYNC;
  125.         if (always)
  126.             proxyType |= PROXY_ALWAYS;
  127.  
  128.         *rv = NS_GetProxyForObject(aEventQ, 
  129.                                    aIID, 
  130.                                    aObj,
  131.                                    proxyType, 
  132.                                    getter_AddRefs(mProxiedService));
  133.     }
  134.  
  135.     nsCOMPtr<nsISupports> mProxiedService;
  136. };
  137.  
  138. #endif // nsProxiedService_h_
  139.